//请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。 
//
// 数值（按顺序）可以分成以下几个部分： 
//
// 
// 若干空格 
// 一个 小数 或者 整数 
// （可选）一个 'e' 或 'E' ，后面跟着一个 整数 
// 若干空格 
// 
//
// 小数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 下述格式之一：
// 
// 至少一位数字，后面跟着一个点 '.' 
// 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字 
// 一个点 '.' ，后面跟着至少一位数字 
// 
// 
// 
//
// 整数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 至少一位数字 
// 
//
// 部分数值列举如下： 
//
// 
// ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"] 
// 
//
// 部分非数值列举如下： 
//
// 
// ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"] 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "0"
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：s = "e"
//输出：false
// 
//
// 示例 3： 
//
// 
//输入：s = "."
//输出：false 
//
// 示例 4： 
//
// 
//输入：s = "    .1  "
//输出：true
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 20 
// s 仅含英文字母（大写和小写），数字（0-9），加号 '+' ，减号 '-' ，空格 ' ' 或者点 '.' 。 
// 
// Related Topics 字符串 👍 348 👎 0

package leetcode.editor.cn;
//leetcode submit region begin(Prohibit modification and deletion)
class SolutionOffer20 {
    public boolean isNumber(String s) {
        s = s.trim();
        if(s.length() == 0) return false;
        if(s.contains("e")) {
            String[] es = s.split("e");
            if(es.length == 0 || es[0].length() == 0){ //"e9"为false
                return false;
            }
            if(es.length == 1){
                return false; //例如"12e"
            } else {
                return (isZhengShu(es[0]) || isXiaoShu(es[0])) && isZhengShu(es[1]);
            }
        } else if(s.contains("E")){
            String[] es = s.split("E");
            if(es.length == 0 || es[0].length() == 0){
                return false;
            }
            if(es.length == 1){
                return false;
            } else {
                return  (isZhengShu(es[0]) || isXiaoShu(es[0])) && isZhengShu(es[1]);
            }
        } else {
            return isZhengShu(s) || isXiaoShu(s);
        }

    }

    public boolean isZhengShu(String s){
        if(s.charAt(0) == '+' || s.charAt(0) == '-'){
            s = s.substring(1);
        }
        int num = 0; //记录数字的个数，要求至少一位数字
        char[] chars = s.toCharArray();
        for(int i = 0; i < chars.length; i++){
            if(chars[i] < '0' || chars[i] > '9'){
                return false;
            } else {
                num++;
            }
        }
        if(num > 0) return true;
        else return false;
    }

    public boolean isXiaoShu(String s){
        if(s.charAt(0) == '+' || s.charAt(0) == '-'){
            s = s.substring(1);
        }
        if(s.length() == 0) return false;
        int dotNum = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '.'){
                dotNum++;
            }
        }
        if(dotNum > 1) return false; //例如"3.."
        String[] arrString = s.split("\\.");
        if(arrString.length == 0 || arrString.length > 2){ //只有一个.的情况(.)或者有两个以上的点(1.2.3)
            return false;
        }
        if(arrString.length == 1){
            char[] chars = arrString[0].toCharArray();
            for(char c : chars){
                if(c < '0' || c > '9'){
                    return false; //不是数字返回false
                }
            }
        }
        if(arrString.length == 2){
            char[] chars = arrString[0].toCharArray();
            for(char c : chars){
                if(c < '0' || c > '9'){
                    return false; //不是数字返回false
                }
            }
            char[] chars1 = arrString[1].toCharArray();
            for(char c : chars1){
                if(c < '0' || c > '9'){
                    return false; //不是数字返回false
                }
            }
        }
        return true;

    }

    public static void main(String[] args) {
        new SolutionOffer20().isNumber("+E3");
    }
}
//leetcode submit region end(Prohibit modification and deletion)
